package com.yupi.springbootinit.statemachine.vo;

import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 状态转换统计视图对象
 */
@Data
public class StateTransitionStatisticsVO {
    
    /**
     * 实体类型
     */
    private String entityType;
    
    /**
     * 开始时间
     */
    private String startTime;
    
    /**
     * 结束时间
     */
    private String endTime;
    
    /**
     * 总转换次数
     */
    private Long totalTransitions;
    
    /**
     * 成功转换次数
     */
    private Long successTransitions;
    
    /**
     * 失败转换次数
     */
    private Long failedTransitions;
    
    /**
     * 成功率
     */
    private BigDecimal successRate;
    
    /**
     * 平均转换耗时(毫秒)
     */
    private Double averageTransitionDuration;
    
    /**
     * 最大转换耗时(毫秒)
     */
    private Long maxTransitionDuration;
    
    /**
     * 最小转换耗时(毫秒)
     */
    private Long minTransitionDuration;
    
    /**
     * 平均耗时
     */
    private Long avgDuration;
    
    /**
     * 最大耗时
     */
    private Long maxDuration;
    
    /**
     * 最小耗时
     */
    private Long minDuration;
    
    /**
     * 慢转换次数
     */
    private Long slowTransitions;
    
    /**
     * 慢转换率
     */
    private BigDecimal slowTransitionRate;
    
    /**
     * 频次统计
     */
    private List<Map<String, Object>> frequencyStats;
    
    /**
     * 转换类型统计
     */
    private List<TransitionTypeStatistics> transitionTypeStats;
    
    /**
     * 操作人统计
     */
    private List<OperatorStatistics> operatorStats;
    
    /**
     * 小时统计
     */
    private List<HourlyStatistics> hourlyStats;
    
    /**
     * 日期统计
     */
    private List<DailyStatistics> dailyStats;
    
    /**
     * 错误统计
     */
    private List<ErrorStatistics> errorStats;
    
    /**
     * 转换类型统计
     */
    @Data
    public static class TransitionTypeStatistics {
        /**
         * 转换类型
         */
        private String transitionType;
        
        /**
         * 转换次数
         */
        private Long count;
        
        /**
         * 成功次数
         */
        private Long successCount;
        
        /**
         * 成功率
         */
        private BigDecimal successRate;
        
        /**
         * 平均耗时
         */
        private Long avgDuration;
    }
    
    /**
     * 操作人统计
     */
    @Data
    public static class OperatorStatistics {
        /**
         * 操作人ID
         */
        private Long operatorId;
        
        /**
         * 操作人姓名
         */
        private String operatorName;
        
        /**
         * 操作次数
         */
        private Long count;
        
        /**
         * 成功次数
         */
        private Long successCount;
        
        /**
         * 成功率
         */
        private BigDecimal successRate;
    }
    
    /**
     * 小时统计
     */
    @Data
    public static class HourlyStatistics {
        /**
         * 小时
         */
        private Integer hour;
        
        /**
         * 转换次数
         */
        private Long count;
        
        /**
         * 成功次数
         */
        private Long successCount;
    }
    
    /**
     * 日期统计
     */
    @Data
    public static class DailyStatistics {
        /**
         * 日期
         */
        private String date;
        
        /**
         * 转换次数
         */
        private Long count;
        
        /**
         * 成功次数
         */
        private Long successCount;
    }
    
    /**
     * 错误统计
     */
    @Data
    public static class ErrorStatistics {
        /**
         * 错误码
         */
        private String errorCode;
        
        /**
         * 错误次数
         */
        private Long count;
        
        /**
         * 错误率
         */
        private BigDecimal errorRate;
        
        /**
         * 最近错误时间
         */
        private String lastErrorTime;
    }
}